/**
 *  Dictinoary Util
 * @author pengyajun
 * @description 数据字典工具类
 * 
 *    初始化数据字典，在需要的时候进行初始化: 
 *        eg: Dictionary.init();
 *    获取单个类型数据字典，如果数据集合中没有，会自动获取 
 *        eg: await Dictionary.get('ID_TYPE')
 */

import HTTP from './http';
import StorageHelper from './storageHelper';
import { STORAGE_CONSTANT } from '../config/storage';
import { API, API_GENERATE } from '../config/api';
import { GLOBAL } from '../config/global';
import ToastUtil from './toast';

const dictTypes = [
  'EC_CORP_TYPE',    //合作类型
  'ID_TYPE',    //证件类型
  'EC_PRICE_TYPE',
  'EC_TRANSPORT_TYPE',
  'EC_SOURCE_CHANNEL',   //发展渠道
  'EC_ENTERPRISE_TYPE',   //企业类型
  'EC_QUALIFICATION_TYPE',   //资质类型
  'EC_TAX_TYPE',   //纳税人类型
  'GOODS_QUALITY_STANDARD',
  'EC_OD_SOURCE_DATA', //泉化价格涞源
  'EC_AUDIT_STATUS',   //审批状态
  'COMPANY_CAPITAL_PROP',   //资本性质
  'COMPANY_PROP',   //企业性质
  'EC_CON_CONFLICT_PROC_MODE', //争议解决
  'EC_CON_QULIF_STANDARD', //质量验收标准
  'EC_LONG_OUT_PAY_TYPE', //外贸付款类型
  'EC_OUT_TRADE_PAY_METHOD',//外贸付款方式
  'EC_TRADE_TYPE',  // 订单 - 交易类型 
  'EC_OT_DELIVERY_TYPE',////价格条款
  'EC_PAY_TYPE',   // 订单 - 付款类型
  'EC_PAY_METHOD',   // 订单 - 付款方式
  'BASE_DATE_SETTLE',  // 订单 - 结算基准日期
  'EC_SALES_DELIVERY_TYPE', // 订单 -交货方式（销售）
  'EC_PURCHASE_DELIVERY_TYPE',  // 订单 -交货方式（采购）
  'EC_OPPO_DELIVERY_TYPE',  //订单（背靠背） - 交货方式
  'EC_OD_LOST_RENDER',  // 订单 - 运损承担方
  'EC_OD_OPPO_LOST_RENDER',  // 订单（背靠背） - 运损承担方
  'APP_PAGE_FLOW_ROLE_MAPPING',   // 审批页面 跳转URL
  'PRICE_SPOT_ORGAN_ID',//现货价审批分公司
  'EC_ADDRESS_TYPE', // 地址类型,
  'LOST_RENDER_TYPE',//途损率
  'EC_CURRENCY',//币种
  'EC_ZXY_CURRENCY',//中新油币种
  'EC_ZXY_OT_DELIVERY_TYPE',//中新油贸易条件  
  'EC_ZXY_SALES_DELIVERY_TYPE',//中新油交货方式 
  'ZXY_SETTLEMENT_FEE_DETAIL_TYPE',//中新油费用
  'EC_OUT_TRADE_PAY_METHOD_S',//中新油销售付款方式
  'EC_OUT_TRADE_PAY_METHOD_P',//中新油采购付款方式
  'CC_STAFF_COMPANY_APPLY_STATUS', // 企业认领申请状态
  'FIN_APP_CREDIT_APPLY_STATUS', //授信审批状态
  'FIN_OVERDUE_DEAL', //授信逾期状态
  'CONTRACT_CHECK_AUDIT_ORGAN_ID',  // 法务审批区域（状态）
  'EC_OD_CANCEL_TYPE', // 撤销类型
  'EC_OD_LONG_TERM', // 长约类型
  'OD_ZXY_PORT',//中新油报关港口
  'EC_ZXY_PAY_METHOD',//中新油付款方式
  'ORDER_SALE_UNITE_FLAG',//订单业务类型 销售
  'ORDER_PURCHASE_UNITE_FLAG',//订单业务类型 采购
  'COMPANY_VISIT_TYPE',  //维护类型查询
  'COMPANY_ADD_VISIT_TYPE ',//维护类型新增
  'COMPANY_ADD_VISIT_METHOD', //维护方式
]

class Dictionary {

  constructor() { }
  _dictMap = {};

  init() {
    return new Promise(async (resolve) => {
      if (!GLOBAL.TOKEN) return resolve({});
      this._dictMap = await StorageHelper.get(STORAGE_CONSTANT.DICTIONARY) || JSON.stringify({});
      try {
        this._dictMap = JSON.parse(this._dictMap);
        if (Object.keys(this._dictMap).length == 0) {//数据字典集合为空
          await this.updated();
        }
      } catch (error) {
        this._dictMap = {};
        ToastUtil.showError('获取数据字典异常，请重试');
        await StorageHelper.set(STORAGE_CONSTANT.DICTIONARY, this._dictMap);
      } finally {
        resolve(this._dictMap)
      }
    })
  }


  //接口获取全部
  async updated() {
    this._dictMap = await HTTP.POST(API_GENERATE(API.GET_LIST_DICTIONARY), dictTypes) || JSON.stringify({});
    await StorageHelper.set(STORAGE_CONSTANT.DICTIONARY, this._dictMap);
  }

  async get(key) {
    return this._dictMap[key] || await this._load(key);
  }

  async _load(key) {
    let data = await HTTP.GET(API_GENERATE(API.GET_DATA_DICTIONARY), { dictTypeCode: key });
    if (!data) {
      ToastUtil.showError('获取数据字典' + key + '异常，请重试');
      data = [];
    } else {
      this._dictMap[key] = data;
      await StorageHelper.set(STORAGE_CONSTANT.DICTIONARY, this._dictMap);
    }
    return data;
  }

  async websocketChange(key, data) {
    this._dictMap[key] = data || [];
    await StorageHelper.set(STORAGE_CONSTANT.DICTIONARY, this._dictMap);
  }

}

module.exports = new Dictionary();